from exten_manager import ExtensionManager
from runner import RunnerMod
from data_manager.dataManager import DatacenterMana


"""
本业务模块(Business_mod) 与几乎所有的功能模块对接. 一对多的关系.
    包括数据中心的实例也在这里创建.
"""
class Business_Mod:
    def __init__(self):
        # 初始化下辖的模块
        # 在业务模块初始化模块中, 创建下辖的功能模块的实例.

        # 创建"扩展管理器"实例
        self.extend_manager = ExtensionManager()

        # 创建"数据中心"实例
        self.datacenter = DatacenterMana()  # 创建数据中心类的实例

        # 创建"执行器"实例
        self.runner = RunnerMod()
        # 创建其他模块实例

    def run_(self, code, code_type='script'):
        # 运行脚本
        # 本业务接口 调用"执行器"的函数 -- 这样GUI就只需要调用run_方法. 而不需要创建"执行器"实例.
        if code_type == 'script':
            self.runner.run_script(code)
            return ''
        elif code_type == 'cmd':
            return self.runner.run_cmd(code)
        else:
            self.runner.run_script(code)
            return ''

    def get_variables(self):
        # 获取变量名
        var_pool = {}
        # 本业务直接调用"执行器"方法获取变量名-- 这样GUI就只需要调用本方法, 而不需要直接访问"执行器".
        for tk,tv in self.runner.get_variables().items():
            if tk[:2]=='__' and tk[-2:] == '__':
                continue
            var_pool[tk] = tv

        return var_pool
    def get_extend_tools(self):
        #
        # 本业务直接调用"扩展管理器"的方法get_hieras --- 这样GUI就只需要调用本方法, 而不需要直接访问"扩展管理器"的函数.
        hieras = self.extend_manager.get_hieras()

        tool_infos = {}
        for hie_name,hiera in hieras.items():
            tool_import_codes = []
            tool_infos[hie_name] = {}
            hiera_tools_nodes = hiera.get_tools()
            for tool_name, tool in hiera_tools_nodes.items():
                # 开始拼接字符串
                import_code = f"from {hie_name}.tools.{tool_name}_dir import {tool_name}"
                tool_import_codes.append(import_code)
            tool_classes = self.runner.build_extend_tools(tool_import_codes)

            for tool_name, tool_class in tool_classes.items():
                tool_node = hiera_tools_nodes.get(tool_name)
                info_dict = {}

                info_dict['class'] = tool_class
                info_dict['label'] = tool_node.label
                tool_infos[hie_name][tool_name] = info_dict
        return tool_infos